package conexionFTP;

import cz.dhl.ftp.Ftp;
import cz.dhl.ftp.FtpConnect;
import cz.dhl.ftp.FtpFile;
import cz.dhl.io.CoFile;
import cz.dhl.io.CoLoad;
import cz.dhl.io.LocalFile;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import tools.GUI.PanelGUI;

/**
 *
 * @author Félix Marín Ramírez | felixmurcia@gmail.com
 * @version 1.1
 */
public class ConexionFTP {

    private String sFTP;
    private String sUser;
    private String sPass;
    private boolean login;
    private boolean camdir;
    private static FtpConnect cn;        //De la Librería JVFTP
    private static Ftp cl;               //De la Librería JVFTP
    private static CoFile dir;           //De la Librería JVFTP
    private static FTPClient client;     //De la librería COMMONS-NET FTP
    private static File rutaFichero;

    /**
     *
     * @param sFTP
     * @param sUser
     * @param sPass
     */
    public ConexionFTP(String sFTP, String sUser, String sPass) {
        this.sFTP = sFTP;
        this.sUser = sUser;
        this.sPass = sPass;

        if (sFTP == null || sUser == null || sPass == null
                || sFTP == "" || sUser == "" || sPass == "") {
            PanelGUI.mensajeError("No puede dejar campos sin rellenar");
        } else if (sFTP != null && sUser != null && sPass != null) {
            try {
                client = new FTPClient();
                cn = FtpConnect.newConnect("ftp://" + sFTP + "/");
                cn.setUserName(sUser);
                cn.setPassWord(sPass);
                cl = new Ftp();
                cl.connect(cn);
                dir = new FtpFile(cl.pwd(), cl);
                conectar();
            } catch (Exception e) {
                PanelGUI.mensajeError("Los datos introducidos no son correctos. (E1)");
            }
        }
    }

    /**
     *
     * @return
     */
    public boolean getLogin() {
        return login;
    }

    /**
     *
     * @return
     */
    public boolean getCamdir() {
        return camdir;
    }

    public File getRutaFichero() {
        return rutaFichero;
    }
    
    public void setRutaFichero(File rutaFichero) {
        this.rutaFichero = rutaFichero;
    }

    /**
     *
     * @return
     */
    public String getsFTP() {
        return sFTP;
    }

    /**
     *
     * @param sFTP
     */
    public void setsFTP(String sFTP) {
        this.sFTP = sFTP;
    }

    /**
     *
     * @return
     */
    public String getsUser() {
        return sUser;
    }

    /**
     *
     * @param sUser
     */
    public void setsUser(String sUser) {
        this.sUser = sUser;
    }

    /**
     *
     * @return
     */
    public String getsPass() {
        return sPass;
    }

    /**
     *
     * @param sPass
     */
    public void setsPass(String sPass) {
        this.sPass = sPass;
    }

    /**
     *
     * @return
     */
    public static FtpConnect getCn() {
        return cn;
    }

    /**
     *
     * @param aCn
     */
    public static void setCn(FtpConnect aCn) {
        cn = aCn;
    }

    /**
     *
     * @return
     */
    public static Ftp getCl() {
        return cl;
    }

    /**
     *
     * @param aCl
     */
    public static void setCl(Ftp aCl) {
        cl = aCl;
    }

    /**
     *
     * @return
     */
    public static CoFile getDir() {
        return dir;
    }

    /**
     *
     * @param aDir
     */
    public static void setDir(CoFile aDir) {
        dir = aDir;
    }

    /**
     *
     * @return
     */
    public static FTPClient getClient() {
        return client;
    }

    /**
     *
     * @param aClient
     */
    public static void setClient(FTPClient aClient) {
        client = aClient;
    }

    /**
     *
     * @throws IOException
     */
    public void conectar() throws IOException {
        if (getsFTP() == null || getsUser() == null || getsPass() == null) {
            PanelGUI.mensajeError("(err 0) Primero debe establecer una conexión");
        } else {

            try {
                client.connect(getsFTP());
                login = client.login(getsUser(), getsPass());
                if (getLogin() == false) {
                    PanelGUI.mensajeError("(err 1) No se pudo establecer conexión");
                } else {
                    PanelGUI.informacion("Conexión establecida correctamente");
                }
            } catch (IOException | NullPointerException e) {
                PanelGUI.mensajeError("No se ha establecido la conexión");
            }
        }
    }

    /**
     *
     * @throws IOException
     */
    public void desconectar() throws IOException {
        try {
            client.logout();
            client.disconnect();
            cl.disconnect();
            PanelGUI.informacion("Conexión cerrada");
        } catch (IOException | NullPointerException e) {
            PanelGUI.mensajeError("No se ha establecido la conexión");
        }
    }

    /**
     *
     */
    public void listarDirActual() {
        try {
            String cadena = "";
            FTPFile[] ftpFile;
            ftpFile = client.listFiles();
            for (int i = 0; i < ftpFile.length; i++) {
                cadena += ftpFile[i].toString() + "\n";
            }
            PanelGUI.informacion(cadena);
        } catch (IOException | NullPointerException e) {
            PanelGUI.mensajeError("No se ha establecido la conexión");
        }
    }

    /**
     *
     * @param directorio
     * @throws IOException
     */
    public void cambiarDeDirectorio(String directorio) throws IOException {
        try {
            camdir = client.changeWorkingDirectory(directorio);
            if (getCamdir()) {
                PanelGUI.informacion("Ahora usted se encuentra en " + client.printWorkingDirectory());
            } else {
                PanelGUI.mensajeError("(err 5) El directorio no existe");
            }
        } catch (IOException | NullPointerException e) {
            PanelGUI.mensajeError("No se ha establecido la conexión");
        }
    }

    /**
     *
     * @param fichero
     * @throws IOException
     * @throws Exception
     */
    public void subirFichero(String fichero) throws IOException, Exception {

        if (getsFTP() == null || getsUser() == null || getsPass() == null) {
            PanelGUI.mensajeError("(err 3) Primero debe establecer una conexión");
        } else {
            try {
                client.setFileType(FTP.BINARY_FILE_TYPE);
                setRutaFichero(new File(fichero));
                if (getRutaFichero().exists() == false) {
                    throw new Exception();
                }
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(getRutaFichero()));
                client.storeFile(fichero, bis);
                PanelGUI.informacion("Operación realizada con éxito");
                bis.close();
            } catch (IOException | NullPointerException e) {
                PanelGUI.mensajeError("No se ha establecido la conexión");
            } catch (Exception e) {
                PanelGUI.mensajeError("El fichero no existe");
            }
        }
    }

    /**
     *
     * @param rutaServidor
     * @param fichero
     * @param ubicacionLocal
     */
//    public void bajarFichero(String rutaServidor, String fichero, String ubicacionLocal) {
//        CoFile ficheroLocal = new LocalFile(ubicacionLocal, fichero);
//        PanelGUI.informacion("Descargando archivo en: " + ubicacionLocal);
//        CoFile archivoRemoto = new FtpFile(rutaServidor + "/" + fichero, cl);
//
//        if (archivoRemoto.exists()) {
//            CoLoad.copy(ficheroLocal, archivoRemoto);
//        } else {
//            PanelGUI.mensajeError("El fichero indicado no existe");
//        }
//    }
    public void bajarFichero(String ubicacionRemota, String fichero, String ubicacionLocal) {
        CoFile archivoLocal = new LocalFile(ubicacionLocal, fichero);
        System.out.println("Descargando archivo en: " + ubicacionLocal);
        CoFile archivoRemoto = new FtpFile(ubicacionRemota + "/" + fichero, cl);
        CoLoad.copy(archivoLocal, archivoRemoto);
    }
}
